#!/usr/bin/env node

const fs = require('fs');
const readline = require('readline');

// 配置
const BYTES_PER_LINE = 16;
const BYTES_PER_GROUP = 8; // 每8个字节一组，用空格分隔

if (process.argv.length < 3) {
    console.error('Usage: node dump.js <filename>');
    process.exit(1);
}

const filename = process.argv[2];

try {
    const fileBuffer = fs.readFileSync(filename);
    const fileSize = fileBuffer.length;

    for (let offset = 0; offset < fileSize; offset += BYTES_PER_LINE) {
        // 1. 打印左侧偏移量 (例如 00001000)
        // process.stdout.write(offset.toString(16).toUpperCase().padStart(8, '0') + '  ');
        process.stdout.write(offset.toString(10).padStart(10, '0') + '  ');

        // 2. 打印中间的十六进制字节
        let hexStr = '';
        let asciiAndDecStr = ' '; // 右侧字符串，以空格开头

        for (let i = 0; i < BYTES_PER_LINE; i++) {
            const currentOffset = offset + i;

            if (currentOffset >= fileSize) {
                // 文件末尾，用空格填充
                hexStr += '   ';
            } else {
                const byte = fileBuffer[currentOffset];
                // 生成十六进制部分 (例如 "7F ")
                hexStr += byte.toString(16).toUpperCase().padStart(2, '0') + ' ';

                // 生成右侧预览部分
                if (byte >= 32 && byte <= 126) {
                    // 可打印ASCII范围，显示字符
                    asciiAndDecStr += String.fromCharCode(byte);
                } else {
                    // 非可打印字符，显示其十进制值，并用尖括号括起来以示区别
                    // 例如 <0>, <255>, <10>
                    asciiAndDecStr += `<${byte}>`;
                }
            }

            // 在字节组之间添加一个额外的空格，方便阅读
            if ((i + 1) % BYTES_PER_GROUP === 0) {
                hexStr += ' ';
            }
        }

        // 打印十六进制部分和您定制的“预览”部分
        console.log(hexStr.padEnd(50, ' ') + ' |' + asciiAndDecStr);
    }
} catch (err) {
    console.error('Error reading file:', err);
}